package bdelegate;

import java.io.Serializable;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;
import java.util.List;

import rmi.InterfazRemotaRest;
import beans.AperturaMesaBean;
import beans.ComandaBean;
import beans.ItemCartaBean;
import beans.MesaBean;
import beans.MozoBean;
import beans.PedidoBean;
import beans.SucursalBean;




public class BdelegateWeb implements Serializable {

	private static final long serialVersionUID = 1L;
	private InterfazRemotaRest sistema;
	private String direccionIP = "localhost";
	private Integer port = 1099;
	private static BdelegateWeb conexion = null;
	
	public static  BdelegateWeb getInstancia()
	{
		if( conexion == null) {
			conexion = new BdelegateWeb();
		}
		return conexion;
	}
	
	public BdelegateWeb() {
		conectar();
	}
	
	private boolean conectar() {
		try {
			Registry reg = LocateRegistry.getRegistry(direccionIP, port);
			sistema = (InterfazRemotaRest)reg.lookup("Restaurant");
			System.out.println("Cliente Web OK");
			return true;
		} catch (RemoteException e) {
			System.out.println("ERROR EXCEPCION REMOTA");
			e.printStackTrace();
		} catch (NotBoundException e) {
			System.out.println("ERROR NOT BOUND");
			e.printStackTrace();
		}
		return false;
	}
	/**
	 * 
	 * @param sucursalId
	 * @return
	 */
	public SucursalBean obtenerDatosSucursal(Integer sucursalId) throws RemoteException
	{
		try {
//			System.out.println("saliendo del BdelegateWb\n");
//			System.out.println("sucursal ID BdelegateWeb "+sucursalId);
			return sistema.obtenerSucursal(sucursalId);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 
	 * @param sucursal 
	 * @return
	 * @throws RemoteException
	 */
	public boolean abrirMesa(Integer cantComensales,
									  List<MesaBean> mesas,
									  MozoBean mozo, Integer idSucursal)
	throws RemoteException
	{
		try {
			return sistema.abrirMesa(cantComensales, mesas, mozo, idSucursal);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 
	 * @param id
	 * @return
	 * @throws RemoteException
	 */
	/*public MozoBean obtenerMozo(Integer id) throws RemoteException{
		try {
			return sistema.obtenerMozo(id);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return null;
	}*/
	
	public  MozoBean obtenerMozo(Integer idMozo)throws RemoteException{
		return sistema.obtenerMozo(idMozo);
	}
	
	public void generarPedido(AperturaMesaBean aMesa, List<ItemCartaBean> listaItems) throws RemoteException {
		try {
//			System.out.println("Entrando a generar Pedido");
			sistema.generarPedido(aMesa, listaItems);
		} catch (RemoteException e) {
//			System.out.println("Saliendo x Catch generar Pedido");
			e.printStackTrace();
		}
	}
	
	
	/**
	 * 
	 * @param apertMesa
	 * @param pedidos
	 */
	public void registrarPedido(AperturaMesaBean apertMesa, List<PedidoBean> pedidos){
		try {
			System.out.println("Entrando a registrarPedido");
			sistema.registrarPedido(apertMesa, pedidos);
		} catch (RemoteException e) {
			System.out.println("Saliendo x Catch registrarPedido");
			e.printStackTrace();
		}
	}
	
	

	public void cierreMesa(AperturaMesaBean apertMesa)throws RemoteException 
	{
		try {
			sistema.cierreMesa(apertMesa);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		
	}
	
	
	
	
	
	/**
	 * 
	 * @return
	 * @throws RemoteException
	 */
	public String hola() throws RemoteException {
		return sistema.hola();
	}
	
	
	/**
	 * 
	 * @param apertMesa
	 * @throws RemoteException
	 */
	public void liberarMesa (AperturaMesaBean apertMesa) throws RemoteException
	{
		try {
			sistema.liberarMesa(apertMesa);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	
	}
	

	public List<ComandaBean> obtenerComandasPorArea(String area) throws RemoteException
	{
		try {
			return sistema.obtenerComandasPorArea(area);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return null;
	
	}
	
	
	public void registrarPago(AperturaMesaBean apertMesa,SucursalBean sucursal,String formaPago) throws RemoteException
	{
		try {
			sistema.registrarPago(apertMesa,sucursal,formaPago);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
	
	}
	
	

	public ComandaBean obtenerComandasPorId(Integer id) throws RemoteException
	{
		try {
			return sistema.obtenerComandasPorId(id);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public void liberarComandas (String[] idComandas) throws RemoteException {
			try {
				sistema.liberarComandas(idComandas);
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
	//miguel
	public ArrayList<MozoBean> ObtenerMozos() throws RemoteException {
		return (ArrayList<MozoBean>) sistema.obtenerMozos();
	}
	
	public List<MozoBean> obtenerMozosPorSector(Integer idSector) throws RemoteException {
		return (ArrayList<MozoBean>) sistema.obtenerMozos();
	}
	
	public ArrayList<MesaBean> obtenerMesasLibres() throws RemoteException{
		return sistema.obtenerMesasLibres();
		
	}
	
	public MesaBean obtenerMesa(Integer idMesa) throws RemoteException{
		
		return sistema.obtenerMesa(idMesa);
	}
	//Analia
	public Integer facturarMesa(AperturaMesaBean apertMesa,SucursalBean sucursal) throws RemoteException
	{
		Integer idfactura=0;
		try {
			idfactura=sistema.facturarMesa(apertMesa, sucursal);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return idfactura;
	}
	
	public FacturaBean obtenerFactura(Integer idfactura)
	{
		FacturaBean factura=new FacturaBean();
		try {
			 factura =sistema.obtenerFactura(idfactura);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return factura;
	}
	
	public FacturaBean obtenerFacturaPorApMesa(Integer id)
	{
		FacturaBean factura=new FacturaBean();
		try {
			 factura =sistema.obtenerFacturaPorApMesa(id);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return factura;
	}
	public CajaBean obtenerCaja(SucursalBean sucursal)
	{
		CajaBean caja=new CajaBean();
		try {
			 caja=sistema.obtenerCaja(sucursal);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		
		return caja;
	}

	
}
	
